/*
 * ArchivoTexto.cpp
 *
 *  Created on: 01/04/2011
 *      Author: leonel
 */

#include "ArchivoTexto.h"

/**
*Constructor de archivo de texto, crea el archivo de texto
*y guarda el nombre del archivo
*
*parametros de entrada: path del archivo txt
*
*parametros de salida: -
*/
ArchivoTexto::ArchivoTexto(const string& path) {
  //crea archivo en modo lectura - escritura
  archivo.open(path.c_str(), fstream::in | fstream::out);

  if (!archivo.is_open()) {
    //si no hubo éxito en la apertura...
    //limpia los flags de control de estado del archivo
    archivo.clear();

    //crea el archivo
    archivo.open(path.c_str(), fstream::out);
    archivo.close();

    //reabre el archivo para lectura - escritura
    archivo.open(path.c_str(), fstream::in | fstream::out);

    if (!archivo.is_open())
      // si no se pudo crear el archivo arroja una excepción/
      throw ios_base::failure("El archivo no pudo ser abierto");
  }
  this->nombre = nombre;

}


/* constructor para crear archivo vacio y abrirlo con Open */

ArchivoTexto::ArchivoTexto(){

}

/**
 * Abre el archivo de texto
 *
 * parametros de entrada: path del archivo
 *
 * parametros de salida: -
 *
 */

void ArchivoTexto::Open(const string& path){
	/* intenta abrir un archivo ya existente */
	archivo.open(path.c_str(), fstream::in | fstream::out );

	if (!archivo.is_open())
	   // si no se pudo crear el archivo arroja una excepción/
	   throw ios_base::failure("El archivo no pudo ser abierto");

}


/**
 * Destructor del archivo de texto - Cierra el archivo de texto
 *
 * paramaetros de entrada: -
 *
 * parametros de salida: -
 *
 */
ArchivoTexto::~ArchivoTexto() {
  archivo.close();
}

/**
 * Escribe un caracter  en el archivo de texto
 * Arroja una excepcion si no se pudo escribir correctamente el archivo
 * parametros de entrada: el caracter a grabar
 *  parametros de salida: -
 *
 */

void ArchivoTexto::escribir(char c) {
  // Intenta escribir el caracter en el archivo
  archivo.put(c);

  if (archivo.fail())
    //si se produjo un error, arroja una excepción
    throw ios_base::failure("No se pudo escribir correctamente el registro");
}

/**
 *
 * Escribe una cadena en el archivo de texto
 * Arroja una excepcion si no pudo agregar la linea
 * parametros de entrada: la cadena string
 *
 * parametros de salida: -
 */

void ArchivoTexto::escribir(const string& cadena) {
  //intenta escribir la cadena en el archivo
  archivo << cadena;

  if (archivo.fail())
    // si se produjo un error, arroja una excepción
    throw std::ios_base::failure("No se pudo escribir correctamente la cadena");
}

/**
 *
 *
 */
void ArchivoTexto::terminarLinea() {
  // intenta escribir en el archivo
  archivo << endl;

  if (archivo.fail())
    //si se produjo un error, arroja una excepción
    throw std::ios_base::failure("No se pudo terminar la linea");
}

/**
 *parametros de entrada:
 *parametros de salida:
 */

void ArchivoTexto::tabular() {
  escribir('\t');
}

/**
 * Lee una linea del archivo de texto
 *parametros de entrada: string cadena
 *parametros de salida: retorna verdadero o falso y la cadena cargada si no hubo problema
 */
bool ArchivoTexto::leerLinea(string &cadena) {
  char linea[MAX_LENGTH];

  // lee del archivo a la linea, hasta haber leido:
  // MAX_LENGTH caracteres, o un fin de linea
  archivo.getline( (char*)&linea , MAX_LENGTH , '\n');
  cadena = linea;

  if (archivo.fail() ) {
    //chequea si se ha producido un error, se devuelve false
    archivo.clear();
    return false;
  }
  return true;
}

/**
 * Posiciona el cursor al comienzo del archivo
 *parametros de entrada:
 *parametros de salida:
 */

void ArchivoTexto::irAlPrincipio() {
  archivo.tellg();
  archivo.clear();
  archivo.seekg(0);
  archivo.seekp(0);
  archivo.tellg();
}

/**
 * Posiciona el cursor al final del archivo
 *parametros de entrada:
 *parametros de salida:
 */

void ArchivoTexto::irAlFinal() {
  archivo.tellg();
  archivo.clear();
  archivo.seekg(0, ios::end);
  archivo.seekp(0, ios::end);
  archivo.tellg();
}

/*le paso una cadena vacia y me le deja con todo el libro
 * NO ESTA PROBADA
 *parametros de entrada: string cadena
 *parametros de salida: -
 */

void ArchivoTexto::MeterTextoEnString(string &Cadena){
	string unaLinea;
	while(!(archivo.eof())) {

	   this->leerLinea(unaLinea);
	   Cadena = Cadena + unaLinea;

	}

}

/**
 * Obtiene el archivo de texto en un string
 * Agrega * al final de cada linea del archivo concatenado en un string
 *
 *parametros de entrada:
 *parametros de salida: libro en string
 */

string ArchivoTexto::obtenerTextoEnString(){
	string cadena;
	//	int MAXLENGTH = 256;
		string linea;
		list<string> Lista;
		list<string>::iterator it;
	    while(!archivo.eof()) {
	    	getline(this->archivo,linea,'\n');
	        linea = linea + ' ';
	        linea = linea + '*';
	    	Lista.push_back(linea);
		 }

	    for(it = Lista.begin();it != Lista.end();it++){
	    //cout << *it <<endl;
	    cadena = cadena + *it;
	    }
	    //cout << cadena << endl;
	    return cadena;
}


/* Este no agrega * al final de la linea del archivo
 *
 *parametros de entrada:
 *parametros de salida: devuelve una cadena con todas las palabras del archivo
 */
string ArchivoTexto::obtener_words(){
	string cadena;
	//	int MAXLENGTH = 256;
		string linea;

	    while(!archivo.eof()) {

	    	getline(this->archivo,linea,'\n');
//	        linea = linea + ' ';
	        //linea = linea + '*';
	        cadena = cadena + linea + ' ';

		 }

//	    for(it = Lista.begin();it != Lista.end();it++){
//	    //cout << *it <<endl;
//	    cadena = cadena + *it;
//	    }

	    return cadena;
}


//bool ArchivoTexto::EsFinArchivo(){
//	return (archivo.eof());
//}



/**
 * Abre el archivo para lectura
 *parametros de entrada:
 *parametros de salida:
 */

void ArchivoTexto::abrirParaLeer(){
	this->archivo.close();
	archivo.open(this->nombre.c_str(), fstream::in );
    if (!archivo.is_open())
      // si no se pudo crear el archivo arroja una excepción/
      throw ios_base::failure("El archivo no pudo ser abierto");
}

/**
 *Abre el archivo de texto para escritura
 *Si no se pudo crear el archivo arroja una excepcion
 *parametros de entrada:
 *parametros de salida:
 */

void ArchivoTexto::abrirParaEscribir(){
	this->archivo.close();
	archivo.open(this->nombre.c_str(), fstream::out );
    if (!archivo.is_open())
      // si no se pudo crear el archivo arroja una excepción/
      throw ios_base::failure("El archivo no pudo ser abierto");

}

/**
 *obtiene el tamanio de lo que se va a guardar en el dato
 *parametros de entrada:
 *parametros de salida:
 */

int ArchivoTexto::obtener_tamanio(){

	string cadena;

	char linea[256];
	while(!(archivo.eof())) {

       archivo.getline(linea,sizeof(linea),'\n');
       cadena = cadena + linea + ' ';
//	   cadena = cadena + ' ';
//	   cadena = cadena + '*';
	}
    return cadena.size();

}
